package com.cskaoyan.javase.oop1._7constructor._1assignment;

/**
 * 构造器的语法:
 * [访问权限修饰符] 类名(形参列表){
 *   // 构造方法体
 * }
 * 在代码中使用"new + 类名/构造器名(实参列表)"就是调用构造器在创建对象过程中,给成员变量赋值
 *
 * 构造器的使用:
 * 1.如果一个Java类中,没有显式的,直接的提供一个构造器,那么就会提供一个默认的无参构造方法,称之为"默认无参"
 *      格式是:
 *      public 类名(){}
 *      这个提供的过程,由编译器完成,编译器编译代码后,自动加上无参构造器
 *
 * 2.如果类中提供了任何一个构造器,那么默认无参就不会再提供了
 *      tips:
 *      在写Java代码时,一般来说,建议定义一个类的时候,可以顺手加上这个类的无参构造器
 *      这会是一个好习惯
 *
 * 3.构造器的标准格式是很固定的,所以idea当中提供了自动生成构造器的快捷键
 *      alt + insert
 *      这种快捷键生成的都是标准格式构造器
 *
 *
 * 构造器的赋值作用:
 * 在Java面向对象当中,给成员变量赋值的手段有很多,但是在种种赋值手段当中
 * 永远最后执行的是构造器的赋值
 * 由于构造器的赋值是最后执行的,所以标准格式构造器的赋值是可以相信的
 * 在标准格式构造器中传入什么参数,那么成员变量的取值最终就是什么!
 *
 * 总结一下目前为止的成员变量的赋值手段:
 * 1.默认初始化，具有默认值。
 * 2.显式赋值，直接将值写在成员变量声明的后面。
 * 3.构造器赋值。
 * 在研究成员变量赋值顺序时，要遵循"掐头去尾"的原则，以上三种赋值方式中：
 *      1.默认初始化永远的第一步，这是头。
 *      2.在创建对象过程中，无论我们后面还要学多少成员变量的赋值方式，构造器总是最后执行的。这是尾。
 *注：由于构造器最后执行，那么标准格式书写的构造器的赋值一定是可靠和正确的。"永远可以相信构造器"
 *      3.显式赋值，见到二位大哥，只好屈居中间执行了。
 *
 * 学习成员变量的赋值顺序,有一个非常好的手段,使用idea的debug模式追踪代码执行
 * 查看成员变量的赋值顺序.
 * 构造器在执行时,在debug模式下的frames窗口,会有一个<init>方法的方法栈帧进栈,表示正在执行构造方法
 *
 * @since 09:55
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student(28);
        System.out.println(s.age);
    }
}

class Student {
    int age = 18;

    // 单参给age赋值
    public Student(int age){
        this.age = age;
    }

    // 无参构造器
    public Student() {
    }
}